package propcalc_lang.ast;

import java.util.Random;

/** Fórmulas que pueden aparecer en el primer nivel del lenguaje, es decir ser
 *  derivados del símbolo inicial.
 *  @author Leonardo Val  
 */
public abstract class Formula {

	/** Genera una instancia aleatoria de Formula. 
	 */
	public static Formula generate(Random random, int min, int max) {
		int i = max > 0 ? random.nextInt(3) : 0;
		switch (i) {
			case 0: return Proposition.generate(random, min, max);
			case 1: return Tautology.generate(random, min, max);
			default: return Consequence.generate(random, min, max);
		}
	}
	
	/** Retorna un texto que de ser pasado por el parser construiría el mismo AST. 
	 */
	abstract public String unparse();
	
	/** Retorna un texto representativo de la estructura del AST, útil para debugging.
	 */
	abstract public String toString();
	
	abstract public int hashCode();
	
	abstract public boolean equals(Object obj);
}
